#include "SelectionSort.h"

#include <QtGui/QButtonGroup>
#include <QtGui/QGroupBox>
#include <QtGui/QGridLayout>
#include <QtGui/QVBoxLayout>
#include <QtGui/QHBoxLayout>
#include <QtGui/QCheckBox>
#include <QtGui/QPushButton>

using namespace std;

/**
 * Constructeur permettant de sélectionner plusieurs objets parmi une
 * liste.
 *
 * @param nbr nombre d'objets
 * @param noms pointeur sur le premier élément de la liste de noms
 * @param titre nom du groupe d'objets
 * @param parent widget parent de l'objet, (par défaut, pas de
 * parent)
 */
SelectionSort::SelectionSort(const unsigned int& nbr, const string* noms,
			     const string& titre, QWidget *parent)
  : BaseSousSel( QString::fromUtf8("SelectionSort"), nbr, noms, titre, parent )
{
  fenetreLayout -> addWidget( boite );

  preparerBoutons();

  setFenetreLayout();
}


/**
 * Constructeur permettant de sélectionner plusieurs objets parmi une
 * liste.
 *
 * @param nbr nombre d'objets
 * @param noms contient la liste de noms
 * @param titre nom du groupe d'objets
 * @param parent widget parent de l'objet, (par défaut, pas de parent)
 */
SelectionSort::SelectionSort(const unsigned int& nbr,
			     const vector<string>& noms,
			     const string& titre, QWidget *parent)
  : BaseSousSel( QString::fromUtf8("SelectionSort"), nbr, noms, titre, parent )
{
  fenetreLayout -> addWidget( boite );

  preparerBoutons();

  setFenetreLayout();
}


/**
 * Constructeur permettant de sélectionner plusieurs objets parmi une
 * liste.
 *
 * @param nbr nombre d'objets
 * @param noms pointeur sur le premier élément de la liste de noms
 * @param deja conteneur des objets déjà connus
 * @param titre nom du groupe d'objets
 * @param parent widget parent de l'objet, (par défaut, pas de
 * parent)
 */
SelectionSort::SelectionSort(const unsigned int& nbr, const string* noms,
			     const vector<bool>& deja, const string& titre,
			     QWidget *parent)
  : BaseSousSel( QString::fromUtf8("SelectionSort"), nbr, noms, deja, titre,
		 parent )
{
  fenetreLayout -> addWidget( boite );

  preparerBoutons();

  setFenetreLayout();
}

/**
 * Constructeur permettant de sélectionner plusieurs objets parmi une
 * liste.
 *
 * @param nbr nombre d'objets
 * @param noms contient la liste de noms
 * @param deja conteneur des objets déjà connus
 * @param titre nom du groupe d'objets
 * @param parent widget parent de l'objet, (par défaut, pas de
 * parent)
 */
SelectionSort::SelectionSort(const unsigned int& nbr,
			     const vector<string>& noms,
			     const vector<bool>& deja, const string& titre,
			     QWidget *parent)
  : BaseSousSel( QString::fromUtf8("SelectionSort"), nbr, noms, deja, titre,
		 parent )
{
  fenetreLayout -> addWidget( boite );

  preparerBoutons();

  setFenetreLayout();
}

/**
 * Constructeur de copie. Il n'y a rien de spécial à faire ici, car
 * cette classe repose entièrement sur le fonctionnement de la classe
 * mère.
 *
 * @param selSort instance de SelectionSort à dupliquer.
 */
SelectionSort::SelectionSort(const SelectionSort& selSort)
  : BaseSousSel( selSort )
{
  fenetreLayout -> addWidget( boite );

  preparerBoutons();

  setFenetreLayout();
}

/**
 * Destructeur, ne fait rien de spécial
 */
SelectionSort::~SelectionSort()
{}

/**
 * Méthode qui permet d'ajouter les boutons "OK" et "Annuler" au
 * conteneur boutons. Elle sert à éviter la duplication de code dans
 * les 4 constructeurs.
 */
void SelectionSort::preparerBoutons()
{
  boutons.push_back( new QPushButton( trUtf8("&Annuler"), this ) );
  boutons.back() -> setToolTip( trUtf8("Revenir à la fenêtre principale sans sauver") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( annuler() ) );

  boutons.push_back( new QPushButton( trUtf8("&OK"), this ) );
  boutons.back() -> setToolTip( trUtf8("Ajouter les compétences sélectionnées") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( fermer() ) );
  
}

/**
 * Permet de rendre le choix dans les checkboxes exclusif, est
 * utilisé pour la détermination des compétences martiales.
 *
 * @param exclu \e true le choix est exclusif, \e false permet de
 * faire un choix multiple (valeur par défaut à l'initialisation de
 * la classe).
 */
void SelectionSort::setExclusif(const bool& exclu)
{
  groupe -> setExclusive( exclu );
}

/**
 * La méthode annuler() est redéfinie pour faire une annulation
 * complète des choix effectués.  Sinon même en annulant la sélection,
 * le conteneur en retour de selectionFaite ne sera pas vide. On
 * supprime donc tous les choix effectués.
 */
void SelectionSort::annuler()
{
  OK = false;

  for (unsigned int i(0); i < dimension; i++)
    {
      if ( groupe -> button( i ) -> isChecked() &&
	   groupe -> button( i ) -> isEnabled() )
	groupe -> button( i ) -> setChecked( false );
    }

  close();
}
